#include <my_head.h>
#include "queue.h"
#include "timeout.h"
#define THNUM 5
#define CLINUM 10

typedef enum {
    id = 0,
    file_name,
    uid,
    pre_dir,
    path,
    file_type,
    hash,
    create_time,
    finish
} fileskey;

typedef enum {
    user_uid = 0,
    user_name,   
    dir_id,
    psw_hash,
    salt_value,
    islogin,
    regis_date,
    isDel
} userkey;


//用于存储读取到的配置文件
//用下面的getConfig(config_data* config)方法读取
typedef struct{
    char ip[100];
    char port[100];
    char rootpath[1024];
    char mysql_host[100];
    char mysql_user[100];
    char mysql_passwd[100];
    char mysql_db[100];
    char mysql_port[100];
    char log[100];
} config_data;

extern config_data* config;

 typedef struct{          
     char statu[200];//是否成功找到 (类似状态码)
     char msg[20000];//返回的信息 依旧是&隔开 客户端自己切割
     char token[2000];//加密后的token
 }recvMsg;

typedef struct c_sends{
    int isstatus;
    char user_id[1000];
    char user_name[1000];
    char password[1000];
    char token[2000];
}c_sends;


client_status* log_or_re(int net_fd, MYSQL *sql);
//登录
client_status* login(int net_fd, c_sends msg, MYSQL *sql);
//注销
bool unlogin(client_status *user, int net_fd);

client_status* regist(int net_fd, c_sends msg, MYSQL *sql);


// socket 传递 信息到服务端 （send)
//my_ls 等函数 中调用my_send ，函数中填充结构体的信息
//调用send 把结构体信息发到服务器端口
//
bool my_ls(sendMsg msg, client_status* user, int net_fd);

bool my_cd(sendMsg msg, client_status* user, int net_fd);

bool my_rm(sendMsg msg, client_status* user, int net_fd);

bool my_pwd(sendMsg msg, client_status* user, int net_fd);

bool my_gets(sendMsg msg, client_status* user, int net_fd);

bool my_puts(sendMsg msg, client_status* user, int net_fd);

bool my_mkdir(sendMsg msg, client_status *user, int net_fd);
//z传输命令 的信息 fd(socket 文件描述符，)

//用于拼接出目的路径地址，
//dest；输出参数，user：存储根路径与当前路径，src：要得到的相对路径（用户输入的路径）
//适用于目录流操作的目的地址
int getpath(char* dest, client_status* user, char* src);

int package(char *str);
//发送 对应函数需要给服务端的信息 
int entoken(c_sends user,char *jwt);

char *detoken(char *token, c_sends *buf);

//
//共享资源
typedef struct status_s{
   pthread_t thds[THNUM];
   int pthread_num;         //线程数目
   Queue_t *net_q;          //队列
   Queue_t *commend_q;
   pthread_mutex_t lock;
   pthread_mutex_t db_lock;
   pthread_cond_t cond;
   bool exit_flag;          //退出信号标志位，置1时表示已经退出
} status_t;
//extern status_t status;

bool getConfig();

int getparameter(char *key, char *value);

bool initMysql();

MYSQL *getsql();

//初始化子进程
int initStatus(status_t *status);
//初始化握手用的套接字
int initSocket(int *skt_fd,char *ip,char *port);
//加入epoll监听
int addEpoll(int epl_fd, int fd);
int delEpoll(int epl_fd, int fd);
//线程的主函数
void* thread_main(void *p);

int work(client_status* user, status_t *status);

////////////////日志宏定义//////////////
void log_func(client_status *user, sendMsg *msg, int num, const char *funname, const char *name);
#define LOG(user, msg) log_func(user, msg, __LINE__, __FUNCTION__, __FILE__)
